/*
 * =====================================================================================
 *
 *       Filename:  cl_timer.cxx
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  10/09/2010 12:01:01 AM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Ken Chen (Ziliang), zlchen.ken@gmail.com
 *        Company:  EMC
 *
 * =====================================================================================
 */

#include "cl_timer.hxx"

namespace neo
{
using namespace std;

shared_ptr<CLTimer> CLTimer::create(const CLCallbackFunctor& cb, 
		                                const CLTimestamp& when, 
																		int msecInterval) 
{
  return shared_ptr<CLTimer>(new CLTimer(cb, when, msecInterval));
}

CLTimer::CLTimer(const CLCallbackFunctor& cb, 
		             const CLTimestamp& when, 
								 int msecInterval) 
  : m_id(CLId::allocate()), 
  m_expiration(when),
  m_msecInterval(msecInterval),
  m_callback(cb)
{
}
	
void CLTimer::restart(const CLTimestamp& when) 
{
  if(isRepeated())
  {
    m_expiration = when + m_msecInterval;
  }
  else
  {
    m_expiration = CLTimestamp::nullTime();
  }
}

bool CLTimer::isExpired(void) const  
{
  return m_expiration < CLTimestamp::nowTime();
}

bool CLTimer::isRepeated(void) const  
{
  return m_msecInterval != 0;
}

const CLTimestamp CLTimer::expirationTime(void) const
{
  return m_expiration;
}

void CLTimer::exec(void) const
{
  m_callback();
}

const CLId CLTimer::identity(void) const
{
  return m_id;
}

} // neo
